bitkeeper revision 1.1159.83.10 (41544e88xdk28a2dPYKcImhs23irug)
authorkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Fri, 24 Sep 2004 16:42:48 +0000 (16:42 +0000)
committerkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Fri, 24 Sep 2004 16:42:48 +0000 (16:42 +0000)
Only free_page_type() on a page that is not yet invalid.

xen/arch/x86/memory.c

index 8cb0b42366db8269e4aa04b3e616f065bf4620ef..0c3fcc5966140d55d83faf176e95de0f359dc97e 100644 (file)
@@ -820,14 +820,23 @@ void put_page_type(struct pfn_info *page)
         nx = x - 1;
 
         ASSERT((x & PGT_count_mask) != 0);
-        ASSERT(x & PGT_validated);
+
+        /*
+         * The page should always be validated while a reference is held. The 
+         * exception is during domain destruction, when we forcibly invalidate 
+         * page-table pages if we detect a referential loop.
+         * See domain.c:relinquish_list().
+         */
+        ASSERT((x & PGT_validated) || 
+               test_bit(DF_DYING, &page->u.inuse.domain->flags));
 
         if ( unlikely((nx & PGT_count_mask) == 0) )
         {
             /* Record TLB information for flush later. Races are harmless. */
             page->tlbflush_timestamp = tlbflush_clock;
             
-            if ( unlikely((nx & PGT_type_mask) <= PGT_l4_page_table) )
+            if ( unlikely((nx & PGT_type_mask) <= PGT_l4_page_table) &&
+                 likely(nx & PGT_validated) )
             {
                 /*
                  * Page-table pages must be unvalidated when count is zero. The